package com.itlong.cloud.commons.service;

import com.itlong.cloud.POJO.DTO.property.CloudIntercomChangeLogGetDTO;
import com.itlong.cloud.POJO.VO.common.CloudEntranceVO;
import com.itlong.cloud.POJO.VO.property.CloudDeviceUpdateInfoVO;
import com.itlong.cloud.POJO.VO.property.CloudEntranceChangeLogPageVO;
import com.itlong.cloud.POJO.VO.property.DeviceBlackListPageVO;
import com.itlong.cloud.POJO.VO.property.EntranceBlackListVO;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.utils.page.Page;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      云门禁业务处理接口
 * </desc>
 *
 * @createDate 2019/02/21
 */
public interface ICloudEntranceService {
    /**
     * <desc>
     *      检测门禁是否存在
     * </desc>
     *
     * @param sn
     * @param doorCount 控制器控制门禁数量
     * @param deviceType 17代表云门禁 22代表云联动器
     * @return
     * @author Jiaqi.X
     * @createDate 2019/02/21
     */
    String checkSnExists(String sn,Integer doorCount,String deviceType);

    /**
     * <desc>
     *      云门禁登录
     * </desc>
     *
     * @param sn
     * @param doorCount 控制器控制门数
     * @param encryptionAbility 加密传输方法 0不加密传输 1自有加密方案 2https安全传输
     * @return
     * @author Jiaqi.X
     * @createDate 2019/02/21
     */
    CloudEntranceVO login(String sn, Integer doorCount,Integer encryptionAbility, String deviceType) throws Exception;

    /**
     * <desc>
     *      从缓存中获取当前登录门禁信息
     * </desc>
     *
     * @param token
     * @return
     * @author Jiaqi.X
     * @createDate 2019/02/21
     */
    CloudEntranceVO retrieve(String token);

    /**
     * <desc>
     *      更新云门禁缓存iot信息
     * </desc>
     *
     * @param cloudEntranceVO
     * @return
     * @author Juguang.S
     * @createDate 2019/02/26
     */
    CloudEntranceVO updateCloudEntranceIotCacheInfo(CloudEntranceVO cloudEntranceVO);

    /**
     * <desc>
     *      根据sn查询该设备信息
     * </desc>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019/02/26
     */
    Map<String,Object> getDeviceInfoBySn(String sn,Integer doorCount);

    /** <desc>
     *      门禁状态上报控制
     * </desc>
     *
     * @param sourceForm 来源 默认itlong
     * @param mainDeviceUnique 控制器门禁设备序列号
     * @param doorNum   需要控制的门禁设备序列号，多个,号分隔
     * @param timeout 超时时长 范围0-300，0表示设备立刻停止上报
     * @param productKey iot产品key
     *
     * @author Jiaqi.X
     * @createDate 2019/02/27
     */
    void entranceStatusCtrl(String sourceForm,String mainDeviceUnique,String doorNum,String timeout,String productKey) throws Exception;

    /**
     * <desc>
     *      门禁开放控制指令
     * </desc>
     *
     * @param sourceForm 来源 默认itlong
     * @param mainDeviceUnique 控制器门禁设备序列号
     * @param doorNum   子门禁设备机号，多个，号分隔
     * @param openCtrl  开门控制类型：0关门 1开门
     * @param timeout 开门时长：范围 0-300，0保持常开，1-300开门时长，单位s
     * @param productKey iot产品key
     * @param userId 开门用户id
     * @param correlationId 开门事件唯一id
     * @param robotFlag 机器人标识,1为机器人开门
     *
     * @author Jiaqi.X
     * @createDate 2019/02/27
     */
    void entranceOpenOrCloseCtrl(String sourceForm,String mainDeviceUnique,String doorNum,
                                        String openCtrl,String timeout,String productKey,String userId,String correlationId,String robotFlag) throws Exception;

    /**
     * <desc>
     *      联动器开放控制指令
     * </desc>
     *
     * @param sourceForm 来源 默认itlong
     * @param mainDeviceUnique 控制器门禁设备序列号
     * @param doorNum   子门禁设备机号，多个，号分隔
     * @param openCtrl  开门控制类型：0关门 1开门
     * @param timeout 开门时长：范围 0-300，0保持常开，1-300开门时长，单位s
     * @param productKey iot产品key
     * @param userId 开门用户id
     * @param type 开门类型
     * @param doorDirection 门方向:0背门,1正门
     * @param floor 真实楼层例:1,2,3,4
     * @param correlationId 开门事件唯一id
     * @param robotFlag 机器人标识,1为机器人开门
     *
     * @author Qiang.S
     * @createDate 2019/05/27
     */
    void wippenOpenOrCloseCtrl(String sourceForm,String mainDeviceUnique,String doorNum,
                                 String openCtrl,String timeout,String productKey,String userId,String type,
                               String doorDirection,String floor,String correlationId,String robotFlag,String modeFloor) throws Exception;

    /**
     * <desc>
     *      设置门禁工作模式
     * </desc>
     *
     * @sourceForm 来源 默认itlong
     * @param mainDeviceUnique  控制器设备序列号
     * @param doorNum   子门禁机号，多个，号分隔
     * @param mode  门禁工作模式，备用
     * @param productKey iot产品key
     *
     * @author Jiaqi.X
     * @createDate 2019/02/27
     */
    public void setEntranceOfficeStatus(String sourceForm,String mainDeviceUnique,String doorNum,String mode,String productKey) throws Exception;

    /**
     * <desc>
     *      添加云门禁用户身份证通行记录
     * </desc>
     *
     * @param userInfo 用户信息
     * @author wangzhi
     * @createDate 2019/02/28
     */
    Integer saveIdCardPassRecord(Map<String, Object> userInfo) throws Exception;

    /**
     * <desc>
     *      获取云门禁轮询命令
     * <desc/>
     *
     * @param getDTO 轮询命令分页
     * @return
     * @author Qiang.S
     * @createDate 2019-03-04
     */
    Page<CloudEntranceChangeLogPageVO> getDeviceChangeLogOrders(CloudIntercomChangeLogGetDTO getDTO) throws Exception;

    /**
     * <desc>
     *     云门禁设备批量完成轮询命名
     * </desc>
     *
     * @param sn
     * @param ids 轮询命令，多个以英文逗号拼接
     * @return 受影响的行数
     * @throws Exception
     * @author Qiang.S
     * @createDate 2019-03-04
     */
    Integer batchFinishChangeLogOrders(String sn, String ids) throws Exception;

    /**
     * <desc>
     *     通知云端升级失败原因
     * </desc>
     *
     * @param sn
     * @param id 轮询命令
     * @param msg 失败原因
     * @return 受影响的行数
     * @throws Exception
     * @author Qiang.S
     * @createDate 2019-06-25
     */
    Integer reportUpdateResult(String sn, String id, String msg) throws Exception;

    /**
     *      获取iot门禁账号及关联的产品id
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/04
     */
    Map<String,Object> getMainDeviceUniqueAndProductKey(String deviceUnique);

    /**
     *      获取iot门禁账号及关联的产品id
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/04
     */
    List<Map<String, Object>> getMainDeviceUniqueAndProductKeyByProjectId(String projectId);

    /**
     * <desc>
     *      获取云门禁或联动器设备更新信息
     * </desc>
     *
     * @param sn
     * @param productType 2云门禁,4联动器
     * @return
     * @author Qiang.S
     * @createDate 2018/08/30
     */
    CloudDeviceUpdateInfoVO deviceEntranceUpdate(String sn, String productType) throws Exception;

    /**
     * <desc>
     *      获取一体式人脸识别门禁更新信息
     * </desc>
     *
     * @param sn
     * @param deviceType 软件类型 4 维护程序，5 业务程序，6 桌面程序，7 通信程序
     * @return
     * @author Qiang.S
     * @createDate 2020/05/25
     */
    CloudDeviceUpdateInfoVO deviceUnibodyFaceUpdate(String sn, String deviceType) throws Exception;

    /**
     * <desc>
     *      判断sn存在性
     * <desc/>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019-03-07
     */
    Integer checkSnExist(String sn) throws Exception;

    /**
     * <desc>
     *      根据sn查询同为一个控制器的设备唯一码
     * <desc/>
     *
     * @param sn
     * @return
     * @author Qiang.S
     * @createDate 2019-03-14
     */
    List<String> getSameControllerDevice(String sn) throws Exception;

    /**
     * <desc>
     *      获取门禁设备iot信息
     * <desc/>
     *
     * @param deviceUnique 设备编号
     * @return
     * @author Qiang.S
     * @createDate 2019-03-15
     */
    CloudEntranceVO getDoorIotInfo(String deviceUnique) throws Exception;

    /**
     * <desc>
     *     根据房间ID查询对应的楼栋与单元ID
     * </desc>
     *
     * @param roomId 房间ID
     * @return 楼栋与单元ID
     * @author wangzhi
     * @createDate 2019/02/27
     */
    String deviceChangeLogGetBuildAndUnitIdByRoomId(String roomId) throws Exception;

    /**
     * <desc>
     *      获取门禁黑名单分页列表
     * </desc>
     *
     * @param cloudEntranceVO
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    DeviceBlackListPageVO<EntranceBlackListVO> pullBlackList(CloudEntranceVO cloudEntranceVO);

    /**
     * <desc>
     *      获取门禁、联动器临时权限
     * </desc>
     *
     * @param vo
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    DeviceAuthTempPageVO<EntranceTempAuthPageVO> getTempAuths(CloudEntranceVO vo) throws Exception;

    /**
     * <desc>
     *      生成人脸指令
     * </desc>
     *
     * @param deviceUnique  人脸识别仪编号
     * @param userId   用户编号
     * @return
     * @author Qiang.S
     * @createDate 2020/06/03
     */
    void createUserInstruct(String deviceUnique, String userId) throws Exception;

    /**
     * <desc>
     *      获取门禁人脸识别配置信息
     * </desc>
     *
     * @param sn
     * @return
     * @author Jiaqi.X
     * @createDate 2018/05/21
     */
    CloudTalkFaceApplyInfoVO getDoorFaceInfo(String sn) throws Exception;

    /**
     * <desc>
     *      根据sn 获取状态
     * </desc>
     *
     * @param
     * @return
     * @author caoshuai
     * @createDate 2020/12/27 11:44
     */
    String getStatusBySn(String sn);
}
